home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / cpp_libs / rjs.lha / RJS / Transport / src / InetAddress.C < prev    next >
C/C++ Source or Header  |  1991-06-14  |  3KB  |  112 lines

  1. #include <stdio.h>
  2. #include <osfcn.h>
  3. #include <libc.h>
  4. #include <errno.h>
  5. #include <string.h>
  6. #include <netdb.h>
  7. #include <iostream.h>
  8.  
  9. #include "Transport.h"
  10.  
  11. extern "C" {
  12.     unsigned long htonl(unsigned long);
  13.     unsigned short htons(unsigned short);
  14.     unsigned short ntohs(unsigned short);
  15.     struct hostent *gethostbyname(const char *host);
  16. }
  17.  
  18. char *RJS_InetAddress::Any="0.0.0.0";
  19. char *RJS_InetAddress::Broadcast="255.255.255.255";
  20.  
  21. const RJS_Status RJS_InetAddress::UnKnownService("unknown service");
  22.  
  23. ostream &operator<<(ostream &os, const RJS_InetAddress &ia)
  24. {
  25.     if (!ia.ss_ok()) os <<"(" << ia.ss_message() << ")";
  26.     else os << "(" << ia.hostname() << "," << ia.port() << ")";
  27.     return os;
  28. }
  29.  
  30. RJS_InetAddress::RJS_InetAddress() 
  31. {
  32.     ss_set(NoHostGiven);    // no address looked up
  33.     addrlen=sizeof(address);
  34. }
  35.  
  36. RJS_InetAddress::RJS_InetAddress(int port) 
  37. {
  38.     lookup(Any,port);
  39. }
  40.  
  41.  
  42. RJS_InetAddress::RJS_InetAddress(const char *hostname, int port) 
  43. {
  44.     lookup(hostname,port);
  45. }
  46.  
  47. RJS_InetAddress::RJS_InetAddress(const char *hostname,
  48.              const char *service,
  49.              const char *proto) 
  50. {
  51.     lookup(hostname,service,proto);
  52. }
  53.  
  54.  
  55. RJS_InetAddress::RJS_InetAddress(const char *service,
  56.              const char *proto) 
  57. {
  58.     lookup(Any,service,proto);
  59. }
  60.  
  61. int RJS_InetAddress::lookup(const char *hostname, int port) 
  62. {
  63.     ss_set(HostFound);
  64.     addrlen=sizeof(address);
  65.         bzero((char *) &address , addrlen);
  66.         address.sin_family = RJS_Socket::AfInet;
  67.     address.sin_port   = htons(port);
  68.     if (hostname==Any) address.sin_addr.s_addr = htonl(INADDR_ANY);
  69.         else if (hostname==Broadcast) address.sin_addr.s_addr = htonl(INADDR_BROADCAST);
  70.     else if ((address.sin_addr.s_addr =inet_addr(hostname))==-1) {
  71.             struct hostent *hp=gethostbyname(hostname);
  72.             if (hp==NULL) ss_set(UnknownHost);
  73.         else bcopy(hp->h_addr,(char*)&address.sin_addr,hp->h_length);
  74.     }
  75.         any_flag = 
  76.              (address.sin_addr.s_addr==htonl(INADDR_ANY)) ? 1 : 0;
  77.         broadcast_flag = 
  78.          (address.sin_addr.s_addr==htonl(INADDR_BROADCAST)) ? 1 : 0;
  79.     return ss_ok();
  80. }
  81.  
  82. int RJS_InetAddress::lookup(const char *hostname, 
  83.             const char *service,
  84.             const char *proto) 
  85. {
  86.     struct servent *se=getservbyname(service,proto);
  87.     if (se==NULL) {
  88.         ss_set(UnKnownService);
  89.         return 0;
  90.     }
  91.  
  92.     return lookup(hostname,ntohs(se->s_port));
  93. }
  94.  
  95. const char *RJS_InetAddress::hostname() const
  96. {
  97.     struct hostent *hp;
  98.     hp=gethostbyaddr((char *)&address.sin_addr,addrlen,RJS_Socket::AfInet);
  99.     if (hp==NULL) return inet_ntoa( address.sin_addr);
  100.     else return hp->h_name;
  101. }
  102.  
  103. const char *RJS_InetAddress::numeric_hostname() const
  104. {
  105.     return inet_ntoa( address.sin_addr);
  106. }
  107.  
  108. int RJS_InetAddress::port() const
  109. {
  110.     return ntohs(address.sin_port);
  111. }
  112.